package com.fengye.security.config;

import org.springframework.boot.autoconfigure.security.servlet.PathRequest;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;

/**
 * @author fengyexjtu@126.com
 * @date 2022年04月11日 8:41 PM
 */

@EnableWebSecurity(debug = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    /**
     * 所有 url 的请求都要启用过滤器链 - 配置服务的安全功能
     *
     *
     * /api/test 只要认证就可以访问
     * /api/** 剩下的/api 下的接口必须拥有 ROLE_ADMIN 权限才能访问
     *
     * 启用 httpBasic 认证,form 认证禁用
     *
     * @author fengyexjtu@126.com
     * @date 2022/4/11 8:49 PM
     * @param http HttpSecurity
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .formLogin(form -> form.loginPage("/login")
                        .usernameParameter("username") // 表单用户名参数
                        .passwordParameter("password") // 表单密码参数
                        .permitAll())
                .authorizeRequests(req -> {
                    req.mvcMatchers("/api/test").authenticated();
                    req.mvcMatchers("/api/**").hasAnyRole("ADMIN");
                    req.anyRequest().authenticated();
                })
                .formLogin().and()
                .httpBasic(Customizer.withDefaults())
                .csrf(AbstractHttpConfigurer::disable)
        ;
    }

    /*
     * 处理 url 的请求不需要经过过滤器 - 用于忽略静态资源
     * @author fengyexjtu@126.com
     * @date 2022/4/12 10:00 AM
     * @param web
     */
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/open/**");
        // 常用位置忽略安全检查
        web.ignoring().requestMatchers(PathRequest.toStaticResources().atCommonLocations());
    }
}
